/*****************************************************************************/
/*                        >>> PPD.c <<<                                      */
/*	Trabajo Practico 2do. cuatrimestre 2011                                  */
/*	TP:"FUSELAJE"                                                            */
/*	GRUPO: Reduce Fat Fast                                                   */
/*	INTEGRANTES: Emanuel Genovese                                            */
/*               Federico Gabriel Garcia                                     */
/*               Federico Pioli                                              */
/*               Esther Insfrain                                             */
/*               Luciano Bagattin                                            */
/*	Fecha UM:                                                                */
/*****************************************************************************/

/*********************************************************************************/
/****************************Include ********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/un.h>
#include <semaphore.h>
#include <pthread.h>
#include "log.h"
#include "../headers/constantes.h"
#include "../headers/estructuras.h"
#include "../headers/func_config.h"
#include "../headers/func_PPD.h"
#include "../headers/func_rutinas.h"
#include "../headers/variables_globales.h"
#include "../headers/func_Disco.h"
#include "func_socket.h"
#include "func_strings.h"

/*************************** Comienzo del programa pcpal ***************************/
int main(int argc, char *argv[]) {
	/*declaracion de variables globales*/
	t_log* log;
	char sPuertoLocal[6] = "\0";
	stManejoHilo *stMH = NULL;
	/*fin de la declaracion de variables globales*/

	log = log_create("Runner", LOG, DEBUG | INFO | WARNING, M_CONSOLE_DISABLE);
	iSacado = 1;

	if (argc != 2) {
		printf(
				"Error en el ingreso de parametros de ejecucion ./PPD <archivo fat32>");
		log_error(
				log,
				SNOMBREPROCESO,
				"Message error: %s",
				"Error en la ejecucion del programa ingreso mal los parametros");
		log_destroy(log);
		exit(1);

	} //fin del argc
getchar();
	/*Cargamos en una variable global los datos del repositorio para hacer las conexiones unix*/
	memset(sPath, '\0', 1024);
	strcpy(sPath, argv[1]);
	iCantPedidosCola1=0;
	iCantPedidosCola2=0;
	/*Levantamos el archivo de configuracion*/
	if (fLoadConfig(&stInfoConfig, log)) {
		printf("No se pudo procesar el archivo de configuracion");
		log_destroy(log);
		return 1;
	} //fin del if

	sem_init(&semColasPedidos1, 0, 0);
	pthread_mutex_init(&tCola, NULL);

	/*verificamos si el algoritmo elegido es fScan en ese caso bloqueamos el semaforo de manejo de la segunda cola*/
	if (!strcmp(stInfoConfig.sAlgo_Planif, "F")) {
		iEstadoCola1 = ACTIVE;
		iEstadoCola2 = WAIT;
		sem_init(&semColasPedidos2, 0, 0);
		pthread_mutex_init(&tCola, NULL);
	} //fi del if;

	iPosicionCabezal = 1;
	pIntacad(stInfoConfig.iPuertoLocal, sPuertoLocal);

	pInicializarCache();
	stMH = (struct stManejoHilo *) malloc(sizeof(stManejoHilo));
	stMH->dC = (struct datosConfig *) malloc(sizeof(datosConfig));
	stMH->dC = &stInfoConfig;
	stMH->log = log;

	if (fMapear(log)==-1) {
		log_error(log, SNOMBREPROCESO, "Message error: %s",
				"Error en el mapeo de memoria");
		log_destroy(log);
		return -1;
	} //fin del fMapear

	/*Instanciamos el hilo para la atencion de pedidos*/

	if (pthread_create(&tAtencionPedidos, NULL, fProcesarAtencionPedidos,
			(void *) stMH)) {
		log_error(log, SNOMBREPROCESO, "Message error: %s",
				"Error en la creacion del hilo de atencion de pedidos");
		log_destroy(log);
		return -1;
	}
	log_info(log, SNOMBREPROCESO, "Message info: %s",
					"Exito en la creacion del hilo de atencion de pedidos");
	iSectores = stInfoConfig.iSectores;
	iCilindros = stInfoConfig.iCilindros;

	if ((strcmp(stInfoConfig.sModoInicio, "L")) == 0) {
		if (fProcesarServer(stInfoConfig, log) == -1) {
			log_error(log, SNOMBREPROCESO, "Message error: %s",
					"Error en el server");
			pDesmapear();
			log_destroy(log);
			return -1;
		} //fin del fProcesarServer

	} else {
		//Me tengo que conectar con el PRAID
		if (fProcesarCliente(stInfoConfig, log) == -1) {
			pDesmapear();
			log_destroy(log);
			return 1;
		} //fin del fProcesarCliente

	} //fin del if

	pthread_join(tAtencionPedidos, NULL);
	log_error(log, SNOMBREPROCESO, "Message error: %s",
			"Error en la ejecucion del programa ingreso mal los parametros");

	pDesmapear();
	log_destroy(log);

	return 0;
} //fin del programa ppal
